import Singlelon from "../../../Framework/Common/Singlelon";
import ModuleBase from "./ModuleBase";

const { ccclass, property } = cc._decorator;

@ccclass
export default class ModuleMgr extends Singlelon<ModuleMgr>() {
    //用于存储所有需要管理的模块
    private _mapModule: Map<string, ModuleBase> = new Map();

    // //单例
    // private static _instance: ModuleMgr = null;
    // static get instance() {
    //     if (!this._instance) {
    //         this._instance = new ModuleMgr();
    //     }
    //     return this._instance;
    // }

    constructor() {
        super();
    }

    //添加模块
    addModule(moduleName: string, module: ModuleBase, ...rest: any[]) {
        if (moduleName.length <= 0 || !module) {
            cc.error("模块名为空或者模块资源为空");
            return;
        }
        this._mapModule.set(moduleName, module);
    }

    //获取模块
    getModule<T>(moduleName: string, ...rest: any[]): T {
        if (moduleName.length <= 0) {
            cc.error("模块名字为空");
            return;
        }
        return this._mapModule.get(moduleName) as T;
    }

    //移除模块
    deleteModule(moduleName: string, ...rest: any[]) {
        if (moduleName.length <= 0 || !this._mapModule.get(moduleName)) {
            cc.error("模块名为空或此模块不存在")
            return;
        }
        this._mapModule.delete(moduleName);
    }


    //清空存储模块的容器
    clearModule() {
        this._mapModule.clear();
    }

    // //删除ModuleMgr的实例对象
    // destroyModule() {
    //     ModuleMgr._instance = null;
    // }

    //管理所有生命周期函数
    onInitModule(...rest: any[]) {
        //Array.from(this._mapModule.values())  取this._mapModule中的值，并创建一个数组，将所有值存入这个数组
        for (let value of Array.from(this._mapModule.values())) {
            //value是每个模块，
            //onInit调用每个模块中的onInit生命周期函数
            //apply()将所有的参数作为一个数组传入到onInit中
            value.onInit.apply(value, arguments);
        }
    }

    onLateInitModule(...rest: any[]) {
        for (let value of Array.from(this._mapModule.values())) {
            value.onLateInit.apply(value, arguments);
        }
    }

    onUpdateModule(dt: number, ...rest: any[]) {
        for (let value of Array.from(this._mapModule.values())) {
            value.onUpdate.apply(value, arguments);
        }

    }
    onLateUpdateModule(dt: number, ...rest: any[]) {
        for (let value of Array.from(this._mapModule.values())) {
            value.onLateUpdate.apply(value, arguments);
        }
    }



    //发送消息
    //msgName消息名字，即触发模块中的函数的函数名
    //moduleName模块名，是对哪个模块发送消息  如果此模块名为空，就对所有模块发送消息
    //虽然是可选参数，但是一定要传，可以是空字符，或者null，因为如果不传，会将后面的剩余参数传入
    sendMsg(msgName: string, moduleName?: string, ...rest: any[]) {
        if (!moduleName || moduleName.length <= 0) {
            for (let value of Array.from(this._mapModule.values())) {
                //arguments表示传入的所有参数，rest是后面的剩余参数
                let cb = value[msgName];
                if (!cb) {
                    value.handleMsg.apply(value, rest);
                    continue;
                }
                cb.apply(value, rest);
            }
            return;
        }

        //传入了模块名，就对具体的模块送消息
        let module = this._mapModule.get(moduleName);
        if (!module) {
            cc.error(moduleName + "模块不存在");
            return;
        }
        let cb = module[msgName];
        if (!cb) {
            module.handleMsg.apply(module, rest);
            return;
        }
        cb.apply(module, rest);
    }
}


